export default {
  menu: {
    knowledgeBase: 'База знаний',
    chat: 'Диалог',
    createChat: 'Создать диалог',
    tenant: 'Информация об аккаунте',
    settings: 'Настройки системы',
    logout: 'Выход',
    uploadKnowledge: 'Загрузить знания',
    deleteRecord: 'Удалить запись',
    newSession: 'Новый диалог',
    confirmLogout: 'Вы уверены, что хотите выйти?',
    systemInfo: 'Информация о системе'
  },
  knowledgeBase: {
    title: 'База знаний',
    list: 'Список баз знаний',
    fileContent: 'Содержимое файла',
    detail: 'Детали базы знаний',
    create: 'Создать базу знаний',
    edit: 'Редактировать базу знаний',
    delete: 'Удалить базу знаний',
    name: 'Название',
    description: 'Описание',
    files: 'Файлы',
    settings: 'Настройки',
    documentCategoryTitle: 'Категории документов',
    faqCategoryTitle: 'Категории FAQ',
    untagged: 'Без метки',
    tagSearchTooltip: 'Поиск тегов',
    tagUpdateSuccess: 'Тег успешно обновлен',
    category: 'Категория',
    tagCreateAction: 'Создать тег',
    tagSearchPlaceholder: 'Введите название тега',
    tagNamePlaceholder: 'Введите название тега',
    tagNameRequired: 'Пожалуйста, укажите название тега',
    tagCreateSuccess: 'Тег создан',
    tagEditSuccess: 'Тег обновлён',
    tagDeleteTitle: 'Удаление тега',
    tagDeleteDesc: 'Удалить тег «{name}»? Связанные FAQ будут без метки.',
    tagDeleteSuccess: 'Тег удалён',
    tagEditAction: 'Переименовать',
    tagDeleteAction: 'Удалить',
    tagEmptyResult: 'Подходящие теги не найдены',
    tagLabel: 'Категория',
    tagPlaceholder: 'Пожалуйста, выберите категорию',
    noTags: 'Нет категорий',
    upload: 'Загрузить файл',
    uploadSuccess: 'Файл успешно загружен!',
    uploadFailed: 'Ошибка загрузки файла!',
    docActionUnsupported: 'Этот тип базы знаний не поддерживает данную операцию',
    fileExists: 'Файл уже существует',
    uploadingMultiple: 'Загрузка {total} файлов...',
    uploadAllSuccess: 'Успешно загружено {count} файлов!',
    uploadPartialSuccess: 'Загрузка завершена: успешно {success}, ошибка {fail}',
    uploadAllFailed: 'Все файлы не удалось загрузить',
    uploadingFolder: 'Загрузка {total} файлов из папки...',
    uploadingValidFiles: 'Загрузка {valid}/{total} действительных файлов...',
    noValidFiles: 'Нет действительных файлов',
    noValidFilesInFolder: 'Все {total} файлов в папке не поддерживаются',
    noValidFilesSelected: 'Все выбранные файлы не поддерживаются',
    hiddenFilesFiltered: 'Отфильтровано {count} скрытых файлов',
    imagesFilteredNoVLM: 'Отфильтровано {count} изображений (VLM не включен)',
    invalidFilesFiltered: 'Отфильтровано {count} неподдерживаемых файлов',
    unsupportedFileType: 'Неподдерживаемый тип файла',
    failedFilesList: 'Неудавшиеся файлы:',
    andMoreFiles: '...и ещё {count} файлов',
    duplicateFilesSkipped: 'Пропущено {count} повторяющихся файлов',
    uploadFile: 'Загрузить файл',
    uploadFileDesc: 'Поддерживает PDF, Word, TXT и т.д.',
    importURL: 'Импорт из URL',
    importURLDesc: 'Импорт по ссылке URL',
    importURLTitle: 'Импорт из URL',
    manualCreate: 'Создать вручную',
    manualCreateDesc: 'Написать содержимое документа напрямую',
    urlRequired: 'Пожалуйста, введите URL',
    invalidURL: 'Пожалуйста, введите корректный URL',
    urlImportSuccess: 'URL успешно импортирован!',
    urlImportFailed: 'Ошибка импорта URL!',
    urlExists: 'Этот URL уже существует',
    urlLabel: 'Адрес URL',
    urlPlaceholder: 'Введите URL веб-страницы, например: https://example.com',
    urlTip: 'Поддерживает импорт различного веб-содержимого. Система автоматически извлечет и проанализирует текстовое содержимое с веб-страницы',
    typeURL: 'URL',
    typeManual: 'Вручную',
    typeFile: 'Файл',
    urlSource: 'Исходный URL',
    documentTitle: 'Название документа',
    webContent: 'Веб-содержимое',
    documentContent: 'Содержимое документа',
    importTime: 'Время импорта',
    createTime: 'Время создания',
    characters: 'символов',
    segment: 'Фрагмент',
    chunkCount: 'Всего {count} фрагментов',
    viewOriginal: 'Просмотр исходного файла',
    viewChunks: 'Просмотр фрагментов',
    originalFileNotSupported: 'Этот тип файла не поддерживает просмотр исходного файла. Пожалуйста, загрузите для просмотра.',
    loadOriginalFailed: 'Не удалось загрузить содержимое исходного файла',
    questions: 'Вопросы',
    generatedQuestions: 'Сгенерированные вопросы',
    confirmDeleteQuestion: 'Вы уверены, что хотите удалить этот вопрос? Соответствующий векторный индекс также будет удален.',
    legacyQuestionCannotDelete: 'Вопросы в устаревшем формате нельзя удалить. Пожалуйста, сгенерируйте вопросы заново.',
    notInitialized: 'База знаний не инициализирована. Пожалуйста, настройте модели в разделе настроек перед загрузкой файлов',
    getInfoFailed: 'Не удалось получить информацию о базе знаний, загрузка файла невозможна',
    missingId: 'Отсутствует ID базы знаний',
    deleteFailed: 'Не удалось удалить. Пожалуйста, попробуйте позже!',
    quickActions: 'Быстрые действия',
    createKnowledgeBase: 'Создать базу знаний',
    knowledgeBaseName: 'Название базы знаний',
    enterName: 'Введите название базы знаний',
    embeddingModel: 'Модель встраивания',
    selectEmbeddingModel: 'Выберите модель встраивания',
    summaryModel: 'Модель суммаризации',
    selectSummaryModel: 'Выберите модель суммаризации',
    rerankModel: 'Модель ранжирования',
    selectRerankModel: 'Выберите модель ранжирования (опционально)',
    createSuccess: 'База знаний успешно создана',
    createFailed: 'Не удалось создать базу знаний',
    updateSuccess: 'База знаний успешно обновлена',
    updateFailed: 'Не удалось обновить базу знаний',
    deleteSuccess: 'База знаний успешно удалена',
    deleteConfirm: 'Вы уверены, что хотите удалить эту базу знаний?',
    fileName: 'Имя файла',
    fileSize: 'Размер файла',
    uploadTime: 'Время загрузки',
    status: 'Статус',
    actions: 'Действия',
    processing: 'Обработка',
    completed: 'Завершено',
    failed: 'Ошибка',
    noFiles: 'Нет файлов',
    dragFilesHere: 'Перетащите файлы сюда или',
    clickToUpload: 'нажмите для загрузки',
    supportedFormats: 'Поддерживаемые форматы',
    maxFileSize: 'Макс. размер файла',
    viewDetails: 'Просмотр деталей',
    downloadFile: 'Скачать файл',
    deleteFile: 'Удалить файл',
    confirmDeleteFile: 'Вы уверены, что хотите удалить этот файл?',
    totalFiles: 'Всего файлов',
    totalSize: 'Общий размер',
    // Дополнительные переводы для KnowledgeBase.vue
    newSession: 'Новый диалог',
    editDocument: 'Редактировать документ',
    draft: 'Черновик',
    draftTip: 'Временно сохранён, не участвует в поиске',
    untitledDocument: 'Документ без названия',
    deleteDocument: 'Удалить документ',
    parsingFailed: 'Парсинг не удался',
    parsingInProgress: 'Парсинг...',
    generatingSummary: 'Генерация резюме...',
    deleteConfirmation: 'Подтверждение удаления',
    confirmDeleteDocument: 'Подтвердить удаление документа "{fileName}", после удаления восстановление невозможно',
    cancel: 'Отмена',
    confirmDelete: 'Подтвердить удаление',
    selectKnowledgeBaseFirst: 'Пожалуйста, сначала выберите базу знаний',
    sessionCreationFailed: 'Не удалось создать диалог',
    sessionCreationError: 'Ошибка создания диалога',
    settingsParsingFailed: 'Не удалось разобрать настройки',
    fileUploadEventReceived: 'Получено событие загрузки файла, загруженный ID базы знаний: {uploadedKbId}, текущий ID базы знаний: {currentKbId}',
    matchingKnowledgeBase: 'Совпадающая база знаний, начинаем обновление списка файлов',
    routeParamChange: 'Изменение параметров маршрута, повторное получение содержимого базы знаний',
    fileUploadEventListening: 'Прослушивание события загрузки файла',
    apiCallKnowledgeFiles: 'Прямой вызов API для получения списка файлов базы знаний',
    responseInterceptorData: 'Поскольку перехватчик ответа уже вернул data, result является частью данных ответа',
    hookProcessing: 'Обработка в соответствии со способом useKnowledgeBase hook',
    errorHandling: 'Обработка ошибок',
    priorityCurrentPageKbId: 'Приоритет использования ID базы знаний текущей страницы',
    fallbackLocalStorageKbId: 'Если на текущей странице нет ID базы знаний, попытка получить ID базы знаний из настроек в localStorage',
    // Дополнительные переводы для KnowledgeBaseList.vue
    createNewKnowledgeBase: 'Создать базу знаний',
    uninitializedWarning: 'Некоторые базы знаний не инициализированы, необходимо сначала настроить информацию о моделях в настройках, чтобы добавить документы знаний',
    initializedStatus: 'Инициализирована',
    notInitializedStatus: 'Не инициализирована',
    needSettingsFirst: 'Необходимо сначала настроить информацию о моделях в настройках, чтобы добавить знания',
    documents: 'Документы',
    configureModelsFirst: 'Пожалуйста, сначала настройте информацию о моделях в настройках',
    confirmDeleteKnowledgeBase: 'Подтвердить удаление этой базы знаний?',
    createKnowledgeBaseDialog: 'Создать базу знаний',
    enterNameKb: 'Введите название',
    enterDescriptionKb: 'Введите описание',
    createKb: 'Создать',
    deleted: 'Удалено',
    deleteFailedKb: 'Не удалось удалить',
    noDescription: 'Нет описания',
    emptyKnowledgeDragDrop: 'База знаний пуста, перетащите файлы для загрузки',
    pdfDocFormat: 'Файлы pdf, doc формата, не более 10 МБ',
    textMarkdownFormat: 'Файлы text, markdown формата, не более 200 КБ',
    dragFileNotText: 'Пожалуйста, перетащите файлы, а не текст или ссылки',
    searchPlaceholder: 'Поиск по базам знаний...',
    docSearchPlaceholder: 'Поиск документов...',
    fileTypeFilter: 'Тип файла',
    allFileTypes: 'Все типы',
    noMatch: 'Совпадающих баз знаний не найдено',
    noKnowledge: 'Нет доступных баз знаний',
    loadingFailed: 'Не удалось загрузить базы знаний'
  },
  agent: {
    taskLabel: 'Задача:',
    copy: 'Копировать',
    addToKnowledgeBase: 'Добавить в базу знаний',
    updatePlan: 'Обновить план',
    webSearchFound: 'Найдено <strong>{count}</strong> результатов веб‑поиска',
    argumentsLabel: 'Параметры',
    toolFallback: 'Инструмент'
  },
  settings: {
    title: 'Настройки',
    modelConfig: 'Настройки модели',
    modelManagement: 'Управление моделями',
    agentConfig: 'Настройки агента',
    webSearchConfig: 'Сетевой поиск',
    mcpService: 'Сервис MCP',
    conversationConfig: 'Настройки диалога',
    conversationStrategy: 'Стратегия диалога',
    systemSettings: 'Настройки системы',
    tenantInfo: 'Информация о арендаторе',
    apiInfo: 'Информация API',
    system: 'Настройки системы',
    systemConfig: 'Системная конфигурация',
    knowledgeBaseSettings: 'Настройки базы знаний',
    configureKbModels: 'Настройка моделей и параметров разделения документов для этой базы знаний',
    manageSystemModels: 'Управление и обновление системных моделей и конфигураций сервисов',
    basicInfo: 'Основная информация',
    documentSplitting: 'Разделение документов',
    apiEndpoint: 'API конечная точка',
    enterApiEndpoint: 'Введите API конечную точку, например: http://localhost',
    enterApiKey: 'Введите API ключ',
    enterKnowledgeBaseId: 'Введите ID базы знаний',
    saveConfig: 'Сохранить конфигурацию',
    reset: 'Сбросить',
    configSaved: 'Конфигурация сохранена успешно',
    enterApiEndpointRequired: 'Введите API конечную точку',
    enterApiKeyRequired: 'Введите API ключ',
    enterKnowledgeBaseIdRequired: 'Введите ID базы знаний',
    name: 'Название',
    enterName: 'Введите название',
    description: 'Описание',
    chunkSize: 'Размер блока',
    chunkOverlap: 'Перекрытие блоков',
    save: 'Сохранить',
    saving: 'Сохранение...',
    saveSuccess: 'Сохранено успешно',
    saveFailed: 'Не удалось сохранить',
    model: 'Модель',
    llmModel: 'LLM модель',
    embeddingModel: 'Модель встраивания',
    rerankModel: 'Модель ранжирования',
    vlmModel: 'Мультимодальная модель',
    modelName: 'Название модели',
    modelUrl: 'URL модели',
    apiKey: 'API ключ',
    cancel: 'Отмена',
    saveFailedSettings: 'Не удалось сохранить настройки',
    enterNameRequired: 'Введите название'
  },
  webSearchSettings: {
    title: 'Настройки веб-поиска',
    description: 'Настройте веб-поиск, чтобы ответы могли включать актуальную информацию из интернета.',
    providerLabel: 'Провайдер поиска',
    providerDescription: 'Выберите поисковый сервис, используемый для веб-поиска',
    providerPlaceholder: 'Выберите поисковую систему...',
    apiKeyLabel: 'API-ключ',
    apiKeyDescription: 'Введите API-ключ выбранного провайдера поиска',
    apiKeyPlaceholder: 'Введите API-ключ',
    maxResultsLabel: 'Максимум результатов',
    maxResultsDescription: 'Максимальное количество результатов за один поиск (1-50)',
    includeDateLabel: 'Включать дату публикации',
    includeDateDescription: 'Добавлять информацию о дате публикации в результаты поиска',
    compressionLabel: 'Метод сжатия',
    compressionDescription: 'Выберите, как обрабатывать содержимое результатов поиска',
    compressionNone: 'Без сжатия',
    compressionSummary: 'LLM-конспект',
    blacklistLabel: 'Чёрный список URL',
    blacklistDescription: 'Исключите домены или URL из результатов. По одному в строке. Поддерживаются подстановки (*) и регулярные выражения (/pattern/).',
    blacklistPlaceholder: 'Например:\n*://*.example.com/*\n/example\\.(net|org)/',
    errors: {
      unknown: 'Неизвестная ошибка'
    },
    toasts: {
      loadProvidersFailed: 'Не удалось загрузить список поисковых провайдеров: {message}',
      saveSuccess: 'Настройки веб-поиска сохранены',
      saveFailed: 'Не удалось сохранить настройки: {message}'
    }
  },
  graphSettings: {
    title: 'Настройки графа знаний',
    description: 'Настройте извлечение сущностей и отношений для автоматического построения графа знаний из текста',
    enableLabel: 'Включить извлечение сущностей и отношений',
    enableDescription: 'Автоматически извлекать сущности и отношения из текста при включении',
    tagsLabel: 'Типы отношений',
    tagsDescription: 'Определите теги типов отношений для извлечения, разделённые запятыми',
    tagsPlaceholder: 'Введите типы отношений, например: работает_в, коллега, друг',
    generateRandomTags: 'Сгенерировать случайные теги',
    sampleTextLabel: 'Образец текста',
    sampleTextDescription: 'Образец текста для тестирования извлечения сущностей и отношений',
    sampleTextPlaceholder: 'Введите текст, содержащий сущности и отношения...',
    generateRandomText: 'Сгенерировать случайный текст',
    entityListLabel: 'Список сущностей',
    entityListDescription: 'Сущности и их атрибуты, извлечённые из текста',
    nodeNamePlaceholder: 'Введите имя сущности',
    attributePlaceholder: 'Введите значение атрибута',
    addAttribute: 'Добавить атрибут',
    manageEntitiesLabel: 'Управление сущностями',
    manageEntitiesDescription: 'Добавить или удалить узлы сущностей',
    addEntity: 'Добавить сущность',
    relationListLabel: 'Список отношений',
    relationListDescription: 'Определите связи отношений между сущностями',
    selectEntity: 'Выберите сущность',
    selectRelationType: 'Выберите тип отношения',
    manageRelationsLabel: 'Управление отношениями',
    manageRelationsDescription: 'Добавить или удалить отношения между сущностями',
    addRelation: 'Добавить отношение',
    extractActionsLabel: 'Действия извлечения',
    extractActionsDescription: 'Выполнить извлечение сущностей и отношений или управлять образцами данных',
    startExtraction: 'Начать извлечение',
    extracting: 'Извлечение...',
    defaultExample: 'Пример по умолчанию',
    clearExample: 'Очистить пример',
    completeModelConfig: 'Пожалуйста, сначала завершите настройку модели',
    tagsGenerated: 'Теги успешно сгенерированы',
    tagsGenerateFailed: 'Не удалось сгенерировать теги',
    textGenerated: 'Текст успешно сгенерирован',
    textGenerateFailed: 'Не удалось сгенерировать текст',
    pleaseInputText: 'Пожалуйста, сначала введите образец текста',
    extractSuccess: 'Извлечение сущностей и отношений выполнено успешно',
    extractFailed: 'Не удалось извлечь сущности и отношения',
    exampleLoaded: 'Пример загружен',
    exampleCleared: 'Пример очищен',
    disabledWarning: 'База данных графа знаний не включена, извлечение сущностей и отношений будет недоступно',
    howToEnable: 'Как включить граф знаний?',
    saveSuccess: 'Настройки графа сохранены',
    saveFailed: 'Не удалось сохранить настройки: {message}',
    errors: {
      unknown: 'Неизвестная ошибка',
    },
  },
  initialization: {
    title: 'Инициализация',
    welcome: 'Добро пожаловать в WeKnora',
    description: 'Пожалуйста, настройте систему перед началом работы',
    step1: 'Шаг 1: Настройка LLM модели',
    step2: 'Шаг 2: Настройка модели встраивания',
    step3: 'Шаг 3: Настройка дополнительных моделей',
    complete: 'Завершить инициализацию',
    skip: 'Пропустить',
    next: 'Далее',
    previous: 'Назад',
    // Ollama сервис
    ollamaServiceStatus: 'Статус службы Ollama',
    refreshStatus: 'Обновить статус',
    ollamaServiceAddress: 'Адрес службы Ollama',
    notConfigured: 'Не настроено',
    notRunning: 'Не запущено',
    normal: 'Нормально',
    installedModels: 'Установленные модели',
    none: 'Временно отсутствует',
    // База знаний
    knowledgeBaseInfo: 'Информация о базе знаний',
    knowledgeBaseName: 'Название базы знаний',
    knowledgeBaseNamePlaceholder: 'Введите название базы знаний',
    knowledgeBaseDescription: 'Описание базы знаний',
    knowledgeBaseDescriptionPlaceholder: 'Введите описание базы знаний',
    // LLM модель
    llmModelConfig: 'Конфигурация LLM большой языковой модели',
    modelSource: 'Источник модели',
    local: 'Ollama (локальный)',
    remote: 'Remote API (удаленный)',
    modelName: 'Название модели',
    modelNamePlaceholder: 'Например: qwen3:0.6b',
    baseUrl: 'Base URL',
    baseUrlPlaceholder: 'Например: https://api.openai.com/v1, удалите часть /chat/completions в конце URL',
    apiKey: 'API Key (необязательно)',
    apiKeyPlaceholder: 'Введите API Key (необязательно)',
    downloadModel: 'Скачать модель',
    installed: 'Установлено',
    notInstalled: 'Не установлено',
    notChecked: 'Не проверено',
    checkConnection: 'Проверить соединение',
    connectionNormal: 'Соединение в норме',
    connectionFailed: 'Ошибка соединения',
    checkingConnection: 'Проверка соединения',
    // Embedding модель
    embeddingModelConfig: 'Конфигурация модели встраивания',
    embeddingWarning: 'В базе знаний уже есть файлы, невозможно изменить конфигурацию модели встраивания',
    dimension: 'Размерность',
    dimensionPlaceholder: 'Введите размерность вектора',
    detectDimension: 'Определить размерность',
    // Rerank модель
    rerankModelConfig: 'Конфигурация модели ранжирования',
    enableRerank: 'Включить модель ранжирования',
    // Мультимодальные настройки
    multimodalConfig: 'Мультимодальная конфигурация',
    enableMultimodal: 'Включить извлечение информации из изображений',
    visualLanguageModelConfig: 'Конфигурация визуально-языковой модели',
    interfaceType: 'Тип интерфейса',
    openaiCompatible: 'Совместимый с OpenAI интерфейс',
    // Настройки хранилища
    storageServiceConfig: 'Конфигурация службы хранения',
    storageType: 'Тип хранения',
    bucketName: 'Bucket Name',
    bucketNamePlaceholder: 'Введите имя Bucket',
    pathPrefix: 'Path Prefix',
    pathPrefixPlaceholder: 'Например: images',
    secretId: 'Secret ID',
    secretIdPlaceholder: 'Введите COS Secret ID',
    secretKey: 'Secret Key',
    secretKeyPlaceholder: 'Введите COS Secret Key',
    region: 'Region',
    regionPlaceholder: 'Например: ap-beijing',
    appId: 'App ID',
    appIdPlaceholder: 'Введите App ID',
    // Тестирование мультимодальных функций
    functionTest: 'Тест функции',
    testDescription: 'Загрузите изображение для тестирования функций описания изображений и распознавания текста модели VLM',
    selectImage: 'Выбрать изображение',
    startTest: 'Начать тест',
    testResult: 'Результат теста',
    imageDescription: 'Описание изображения:',
    textRecognition: 'Распознавание текста:',
    processingTime: 'Время обработки:',
    testFailed: 'Тест не удался',
    multimodalProcessingFailed: 'Ошибка мультимодальной обработки',
    // Разделение документов
    documentSplittingConfig: 'Конфигурация разделения документов',
    splittingStrategy: 'Стратегия разделения',
    balancedMode: 'Сбалансированный режим',
    balancedModeDesc: 'Размер блока: 1000 / Перекрытие: 200',
    precisionMode: 'Точный режим',
    precisionModeDesc: 'Размер блока: 512 / Перекрытие: 100',
    contextMode: 'Контекстный режим',
    contextModeDesc: 'Размер блока: 2048 / Перекрытие: 400',
    custom: 'Пользовательский',
    customDesc: 'Настроить параметры вручную',
    chunkSize: 'Размер блока',
    chunkOverlap: 'Перекрытие блоков',
    separatorSettings: 'Настройки разделителей',
    selectOrCustomSeparators: 'Выберите или настройте разделители',
    characters: 'символов',
    separatorParagraph: 'Разделитель абзацев (\\n\\n)',
    separatorNewline: 'Перевод строки (\\n)',
    separatorPeriod: 'Точка (。)',
    separatorExclamation: 'Восклицательный знак (！)',
    separatorQuestion: 'Вопросительный знак (？)',
    separatorSemicolon: 'Точка с запятой (;)',
    separatorChineseSemicolon: 'Китайская точка с запятой (；)',
    separatorComma: 'Запятая (,)',
    separatorChineseComma: 'Китайская запятая (，)',
    // Извлечение сущностей и отношений
    entityRelationExtraction: 'Извлечение сущностей и отношений',
    enableEntityRelationExtraction: 'Включить извлечение сущностей и отношений',
    relationTypeConfig: 'Конфигурация типов отношений',
    relationType: 'Тип отношения',
    generateRandomTags: 'Сгенерировать случайные теги',
    completeModelConfig: 'Пожалуйста, завершите конфигурацию модели',
    systemWillExtract: 'Система будет извлекать соответствующие сущности и отношения из текста в соответствии с выбранными типами отношений',
    extractionExample: 'Пример извлечения',
    sampleText: 'Пример текста',
    sampleTextPlaceholder: 'Введите текст для анализа, например: "Красный особняк", также известный как "Сон в красном тереме", является одним из четырех великих классических произведений китайской литературы, написанным Цинь Сюэцином в династии Цин...',
    generateRandomText: 'Сгенерировать случайный текст',
    entityList: 'Список сущностей',
    nodeName: 'Имя узла',
    nodeNamePlaceholder: 'Имя узла',
    addAttribute: 'Добавить атрибут',
    attributeValue: 'Значение атрибута',
    attributeValuePlaceholder: 'Значение атрибута',
    addEntity: 'Добавить сущность',
    completeEntityInfo: 'Пожалуйста, завершите информацию о сущности',
    relationConnection: 'Соединение отношений',
    selectEntity: 'Выберите сущность',
    addRelation: 'Добавить отношение',
    completeRelationInfo: 'Пожалуйста, завершите информацию об отношении',
    startExtraction: 'Начать извлечение',
    extracting: 'Извлечение...',
    defaultExample: 'Пример по умолчанию',
    clearExample: 'Очистить пример',
    // Кнопки и сообщения
    updateKnowledgeBaseSettings: 'Обновить настройки базы знаний',
    updateConfigInfo: 'Обновить информацию о конфигурации',
    completeConfig: 'Завершить конфигурацию',
    waitForDownloads: 'Пожалуйста, дождитесь завершения загрузки всех моделей Ollama перед обновлением конфигурации',
    completeModelConfigInfo: 'Пожалуйста, завершите информацию о конфигурации модели',
    knowledgeBaseIdMissing: 'Отсутствует ID базы знаний',
    knowledgeBaseSettingsUpdateSuccess: 'Настройки базы знаний успешно обновлены',
    configUpdateSuccess: 'Конфигурация успешно обновлена',
    systemInitComplete: 'Инициализация системы завершена',
    operationFailed: 'Операция не удалась',
    updateKnowledgeBaseInfoFailed: 'Не удалось обновить базовую информацию о базе знаний',
    knowledgeBaseIdMissingCannotSave: 'Отсутствует ID базы знаний, невозможно сохранить конфигурацию',
    operationFailedCheckNetwork: 'Операция не удалась, проверьте сетевое соединение',
    imageUploadSuccess: 'Изображение успешно загружено, можно начать тестирование',
    multimodalConfigIncomplete: 'Мультимодальная конфигурация неполная, пожалуйста, завершите мультимодальную конфигурацию перед загрузкой изображения',
    pleaseSelectImage: 'Пожалуйста, выберите изображение',
    multimodalTestSuccess: 'Мультимодальный тест успешен',
    multimodalTestFailed: 'Мультимодальный тест не удался',
    pleaseEnterSampleText: 'Пожалуйста, введите текст примера',
    pleaseEnterRelationType: 'Пожалуйста, введите тип отношения',
    pleaseEnterLLMModelConfig: 'Пожалуйста, введите конфигурацию LLM большой языковой модели',
    noValidNodesExtracted: 'Не извлечено допустимых узлов',
    noValidRelationsExtracted: 'Не извлечено допустимых отношений',
    extractionFailedCheckNetwork: 'Извлечение не удалось, проверьте сетевое соединение или формат текста',
    generateFailedRetry: 'Генерация не удалась, попробуйте еще раз',
    pleaseCheckForm: 'Пожалуйста, проверьте правильность заполнения формы',
    detectionSuccessful: 'Обнаружение успешно, размерность автоматически заполнена как',
    detectionFailed: 'Обнаружение не удалось',
    detectionFailedCheckConfig: 'Обнаружение не удалось, проверьте конфигурацию',
    modelDownloadSuccess: 'Модель успешно загружена',
    modelDownloadFailed: 'Не удалось загрузить модель',
    downloadStartFailed: 'Не удалось начать загрузку',
    queryProgressFailed: 'Не удалось запросить прогресс',
    checkOllamaStatusFailed: 'Не удалось проверить статус Ollama',
    getKnowledgeBaseInfoFailed: 'Не удалось получить информацию о базе знаний',
    textRelationExtractionFailed: 'Не удалось извлечь текстовые отношения',
    // Валидация
    pleaseEnterKnowledgeBaseName: 'Пожалуйста, введите название базы знаний',
    knowledgeBaseNameLength: 'Длина названия базы знаний должна быть от 1 до 50 символов',
    knowledgeBaseDescriptionLength: 'Длина описания базы знаний не может превышать 200 символов',
    pleaseEnterLLMModelName: 'Пожалуйста, введите название LLM модели',
    pleaseEnterBaseURL: 'Пожалуйста, введите BaseURL',
    pleaseEnterEmbeddingModelName: 'Пожалуйста, введите название модели встраивания',
    pleaseEnterEmbeddingDimension: 'Пожалуйста, введите размерность встраивания',
    dimensionMustBeInteger: 'Размерность должна быть допустимым целым числом, обычно 768, 1024, 1536, 3584 и т.д.',
    pleaseEnterTextContent: 'Пожалуйста, введите текстовое содержание',
    textContentMinLength: 'Текстовое содержание должно содержать не менее 10 символов',
    pleaseEnterValidTag: 'Пожалуйста, введите действительный тег',
    tagAlreadyExists: 'Этот тег уже существует',
    // Дополнительные переводы для InitializationContent.vue
    checkFailed: 'Проверка не удалась',
    startingDownload: 'Запуск загрузки...',
    downloadStarted: 'Загрузка началась',
    model: 'Модель',
    startModelDownloadFailed: 'Не удалось запустить загрузку модели',
    downloadCompleted: 'Загрузка завершена',
    downloadFailed: 'Загрузка не удалась',
    knowledgeBaseSettingsModeMissingId: 'В режиме настроек базы знаний отсутствует ID базы знаний',
    completeEmbeddingConfig: 'Пожалуйста, сначала полностью заполните конфигурацию встраивания',
    detectionSuccess: 'Обнаружение успешно,',
    dimensionAutoFilled: 'размерность автоматически заполнена:',
    checkFormCorrectness: 'Пожалуйста, проверьте правильность заполнения формы',
    systemInitializationCompleted: 'Инициализация системы завершена',
    generationFailedRetry: 'Генерация не удалась, пожалуйста, попробуйте еще раз',
    chunkSizeDesc: 'Размер каждого текстового блока. Большие блоки сохраняют больше контекста, но могут снизить точность поиска.',
    chunkOverlapDesc: 'Количество символов, перекрывающихся между соседними блоками. Помогает сохранить контекст на границах блоков.',
    selectRelationType: 'Выберите тип отношения'
  },
  auth: {
    login: 'Вход',
    logout: 'Выход',
    username: 'Имя пользователя',
    email: 'Почта Email',
    password: 'Пароль',
    confirmPassword: 'Подтвердите пароль',
    rememberMe: 'Запомнить меня',
    forgotPassword: 'Забыли пароль?',
    loginSuccess: 'Вход выполнен успешно!',
    loginFailed: 'Ошибка входа',
    loggingIn: 'Вход...',
    register: 'Регистрация',
    registering: 'Регистрация...',
    createAccount: 'Создать аккаунт',
    haveAccount: 'Уже есть аккаунт?',
    noAccount: 'Ещё нет аккаунта?',
    backToLogin: 'Вернуться ко входу',
    registerNow: 'Зарегистрироваться',
    registerSuccess: 'Регистрация успешна! Система создала для вас эксклюзивного арендатора, пожалуйста, войдите',
    registerFailed: 'Ошибка регистрации',
    subtitle: 'Фреймворк понимания документов и семантического поиска на основе больших моделей',
    registerSubtitle: 'После регистрации система создаст для вас эксклюзивного арендатора',
    emailPlaceholder: 'Введите адрес электронной почты',
    passwordPlaceholder: 'Введите пароль (8-32 символа, включая буквы и цифры)',
    confirmPasswordPlaceholder: 'Введите пароль ещё раз',
    usernamePlaceholder: 'Введите имя пользователя',
    emailRequired: 'Введите адрес электронной почты',
    emailInvalid: 'Введите правильный формат электронной почты',
    passwordRequired: 'Введите пароль',
    passwordMinLength: 'Пароль должен быть не менее 8 символов',
    passwordMaxLength: 'Пароль не может превышать 32 символа',
    passwordMustContainLetter: 'Пароль должен содержать буквы',
    passwordMustContainNumber: 'Пароль должен содержать цифры',
    usernameRequired: 'Введите имя пользователя',
    usernameMinLength: 'Имя пользователя должно быть не менее 2 символов',
    usernameMaxLength: 'Имя пользователя не может превышать 20 символов',
    usernameInvalid: 'Имя пользователя может содержать только буквы, цифры, подчёркивания и китайские иероглифы',
    confirmPasswordRequired: 'Подтвердите пароль',
    passwordMismatch: 'Введённые пароли не совпадают',
    loginError: 'Ошибка входа, пожалуйста, проверьте электронную почту или пароль',
    loginErrorRetry: 'Ошибка входа, пожалуйста, повторите попытку позже',
    registerError: 'Ошибка регистрации, пожалуйста, повторите попытку позже',
    forgotPasswordNotAvailable: 'Функция восстановления пароля временно недоступна, пожалуйста, свяжитесь с администратором'
  },
  authStore: {
    errors: {
      parseUserFailed: 'Не удалось разобрать данные пользователя',
      parseTenantFailed: 'Не удалось разобрать данные арендатора',
      parseKnowledgeBasesFailed: 'Не удалось разобрать список баз знаний',
      parseCurrentKnowledgeBaseFailed: 'Не удалось разобрать текущую базу знаний'
    }
  },
  common: {
    confirm: 'Подтвердить',
    cancel: 'Отмена',
    save: 'Сохранить',
    delete: 'Удалить',
    edit: 'Редактировать',
    default: 'По умолчанию',
    create: 'Создать',
    search: 'Поиск',
    filter: 'Фильтр',
    export: 'Экспорт',
    import: 'Импорт',
    upload: 'Загрузить',
    download: 'Скачать',
    refresh: 'Обновить',
    loading: 'Загрузка...',
    noData: 'Нет данных',
    noMoreData: 'Весь контент загружен',
    error: 'Ошибка',
    success: 'Успешно',
    warning: 'Предупреждение',
    info: 'Информация',
    selectAll: 'Выбрать все',
    yes: 'Да',
    no: 'Нет',
    ok: 'OK',
    close: 'Закрыть',
    back: 'Назад',
    next: 'Далее',
    finish: 'Завершить',
    all: 'Все',
    reset: 'Сбросить',
    clear: 'Очистить',
    website: 'Официальный сайт',
    github: 'GitHub',
    wechat: '微信公众号',
    on: 'Вкл',
    off: 'Выкл',
    resetToDefault: 'Сбросить по умолчанию',
    confirmDelete: 'Подтвердить удаление',
    deleteSuccess: 'Успешно удалено',
    deleteFailed: 'Ошибка удаления',
  },
  file: {
    upload: 'Загрузить файл',
    uploadSuccess: 'Файл успешно загружен',
    uploadFailed: 'Ошибка загрузки файла',
    delete: 'Удалить файл',
    deleteSuccess: 'Файл успешно удален',
    deleteFailed: 'Ошибка удаления файла',
    download: 'Скачать файл',
    preview: 'Предпросмотр',
    unsupportedFormat: 'Неподдерживаемый формат файла',
    maxSizeExceeded: 'Превышен максимальный размер файла',
    selectFile: 'Выберите файл'
  },
  tenant: {
    title: 'Информация об арендаторе',
    currentTenant: 'Текущий арендатор',
    switchTenant: 'Сменить арендатора',
    sectionDescription: 'Просмотр детальной конфигурации арендатора',
    apiDocument: 'Документация API',
    name: 'Имя арендатора',
    id: 'ID арендатора',
    createdAt: 'Дата создания',
    updatedAt: 'Дата обновления',
    status: 'Статус',
    active: 'Активен',
    inactive: 'Неактивен',
    // Дополнительные переводы для TenantInfo.vue
    systemInfo: 'Системная информация',
    viewSystemInfo: 'Просмотр информации о версии системы и конфигурации учётной записи пользователя',
    version: 'Версия',
    buildTime: 'Время сборки',
    goVersion: 'Версия Go',
    userInfo: 'Информация о пользователе',
    userId: 'ID пользователя',
    username: 'Имя пользователя',
    email: 'Электронная почта',
    tenantInfo: 'Информация об арендаторе',
    tenantId: 'ID арендатора',
    tenantName: 'Название арендатора',
    description: 'Описание',
    business: 'Бизнес',
    noDescription: 'Нет описания',
    noBusiness: 'Нет',
    statusActive: 'Активен',
    statusInactive: 'Не активирован',
    statusSuspended: 'Приостановлен',
    statusUnknown: 'Неизвестен',
    apiKey: 'API Key',
    keepApiKeySafe: 'Пожалуйста, храните ваш API Key в безопасности, не раскрывайте его в общественных местах или репозиториях кода',
    storageInfo: 'Информация о хранилище',
    storageQuota: 'Квота хранилища',
    used: 'Использовано',
    usage: 'Использование',
    apiDevDocs: 'Документация для разработчиков API',
    useApiKey: 'Используйте ваш API Key для начала разработки, просмотрите полную документацию API и примеры кода.',
    viewApiDoc: 'Просмотреть документацию API',
    loadingAccountInfo: 'Загрузка информации об учётной записи...',
    loadingInfo: 'Загрузка данных...',
    loadFailed: 'Загрузка не удалась',
    retry: 'Повторить',
    apiKeyCopied: 'API Key скопирован в буфер обмена',
    unknown: 'Неизвестно',
    formatError: 'Ошибка формата',
    searchPlaceholder: 'Поиск по имени или введите ID арендатора...',
    searchHint: 'Поиск по имени или введите ID арендатора напрямую',
    noMatch: 'Не найдено подходящих арендаторов',
    switchSuccess: 'Арендатор успешно переключен',
    loadTenantsFailed: 'Не удалось загрузить список арендаторов',
    loading: 'Загрузка...',
    loadMore: 'Загрузить еще',
    details: {
      idLabel: 'ID арендатора',
      idDescription: 'Уникальный идентификатор вашего арендатора',
      nameLabel: 'Название арендатора',
      nameDescription: 'Название арендатора, к которому вы принадлежите',
      descriptionLabel: 'Описание арендатора',
      descriptionDescription: 'Подробное описание арендатора',
      businessLabel: 'Бизнес арендатора',
      businessDescription: 'Бизнес-направление, к которому относится арендатор',
      statusLabel: 'Статус арендатора',
      statusDescription: 'Текущий рабочий статус арендатора',
      createdAtLabel: 'Время создания арендатора',
      createdAtDescription: 'Дата и время создания арендатора'
    },
    storage: {
      quotaLabel: 'Квота хранения',
      quotaDescription: 'Общий объём хранилища, выделенный арендатору',
      usedLabel: 'Использовано хранения',
      usedDescription: 'Объём уже использованного пространства',
      usageLabel: 'Использование хранения',
      usageDescription: 'Процент использованного пространства'
    },
    messages: {
      fetchFailed: 'Не удалось получить информацию об арендаторе',
      networkError: 'Ошибка сети, попробуйте позже'
    },
    api: {
      title: 'Информация об API',
      description: 'Просматривайте и управляйте своим API-ключом',
      keyLabel: 'API Key',
      keyDescription: 'Ключ для API-запросов. Храните его в безопасности.',
      copyTitle: 'Скопировать API Key',
      docLabel: 'Документация API',
      docDescription: 'Ознакомьтесь с полной документацией и примерами API,',
      openDoc: 'Открыть документацию',
      userSectionTitle: 'Информация о пользователе',
      userIdLabel: 'ID пользователя',
      userIdDescription: 'Ваш уникальный идентификатор пользователя',
      usernameLabel: 'Имя пользователя',
      usernameDescription: 'Имя, используемое для входа',
      emailLabel: 'Электронная почта',
      emailDescription: 'Ваш зарегистрированный адрес электронной почты',
      createdAtLabel: 'Время регистрации',
      createdAtDescription: 'Время создания учётной записи',
      noKey: 'API Key отсутствует',
      copySuccess: 'API Key скопирован в буфер обмена',
      copyFailed: 'Не удалось скопировать, пожалуйста, сделайте это вручную'
    }
  },
  system: {
    title: 'Системная информация',
    sectionDescription: 'Просмотр сведений о версии системы и конфигурации учётной записи пользователя',
    loadingInfo: 'Загрузка данных...',
    retry: 'Повторить',
    versionLabel: 'Версия системы',
    versionDescription: 'Текущий номер версии системы',
    buildTimeLabel: 'Время сборки',
    buildTimeDescription: 'Время, когда система была собрана',
    goVersionLabel: 'Версия Go',
    goVersionDescription: 'Версия языка Go, используемая backend',
    keywordIndexEngineLabel: 'Движок индексации ключевых слов',
    keywordIndexEngineDescription: 'Используемый в настоящее время движок индексации ключевых слов',
    vectorStoreEngineLabel: 'Движок векторного хранилища',
    vectorStoreEngineDescription: 'Используемый в настоящее время движок векторного хранилища',
    graphDatabaseEngineLabel: 'Движок графовой базы данных',
    graphDatabaseEngineDescription: 'Используемый в настоящее время движок графовой базы данных',
    unknown: 'Неизвестно',
    messages: {
      fetchFailed: 'Не удалось получить информацию о системе',
      networkError: 'Ошибка сети, попробуйте позже'
    }
  },
  mcp: {
    testResult: {
      title: 'Результат теста: {name}',
      connectionSuccess: 'Соединение установлено',
      connectionFailed: 'Соединение не удалось',
      toolsTitle: 'Доступные инструменты',
      resourcesTitle: 'Доступные ресурсы',
      descriptionLabel: 'Описание',
      schemaLabel: 'Структура параметров',
      emptyDescription: 'Сервис не предоставил инструменты или ресурсы'
    }
  },
  error: {
    network: 'Ошибка сети',
    server: 'Ошибка сервера',
    notFound: 'Не найдено',
    unauthorized: 'Не авторизован',
    forbidden: 'Доступ запрещен',
    unknown: 'Неизвестная ошибка',
    tryAgain: 'Пожалуйста, попробуйте еще раз'
  },
  model: {
    llmModel: 'LLM модель',
    embeddingModel: 'Модель встраивания',
    rerankModel: 'Модель ранжирования',
    vlmModel: 'Мультимодальная модель',
    modelName: 'Название модели',
    modelProvider: 'Поставщик модели',
    modelUrl: 'URL модели',
    apiKey: 'API ключ',
    testConnection: 'Проверить соединение',
    connectionSuccess: 'Соединение успешно',
    connectionFailed: 'Ошибка соединения',
    dimension: 'Размерность',
    maxTokens: 'Макс. токенов',
    temperature: 'Температура',
    topP: 'Top P',
    selectModel: 'Выберите модель',
    customModel: 'Пользовательская модель',
    builtinModel: 'Встроенная модель',
    defaultTag: 'По умолчанию',
    addModelInSettings: 'Перейти в общие настройки для добавления моделей',
    loadFailed: 'Не удалось загрузить список моделей',
    selectModelPlaceholder: 'Выберите модель',
    searchPlaceholder: 'Поиск моделей...',
    editor: {
      addTitle: 'Добавить модель',
      editTitle: 'Редактировать модель',
      sourceLabel: 'Источник модели',
      sourceLocal: 'Ollama (локальный)',
      sourceRemote: 'Remote API (удалённый)',
      description: {
        chat: 'Настройте языковую модель для диалогов',
        embedding: 'Настройте модель встраивания для текстовой векторизации',
        rerank: 'Настройте модель для повторного ранжирования результатов',
        vllm: 'Настройте визуально-языковую модель для мультимодального понимания',
        default: 'Настройте информацию о модели'
      },
      modelNamePlaceholder: {
        local: 'например: llama2:latest',
        remote: 'например: gpt-4, claude-3-opus',
        localVllm: 'например: llava:latest',
        remoteVllm: 'например: gpt-4-vision-preview'
      },
      baseUrlLabel: 'Base URL',
      baseUrlPlaceholder: 'например: https://api.openai.com/v1',
      baseUrlPlaceholderVllm: 'например: http://localhost:11434/v1',
      apiKeyOptional: 'API Key (опционально)',
      apiKeyPlaceholder: 'Введите API Key',
      connectionTest: 'Проверка соединения',
      testing: 'Проверка...',
      testConnection: 'Проверить соединение',
      searchPlaceholder: 'Поиск моделей...',
      downloadLabel: 'Скачать: {keyword}',
      refreshList: 'Обновить список',
      dimensionLabel: 'Размерность вектора',
      dimensionPlaceholder: 'например: 1536',
      checkDimension: 'Определить размерность',
      dimensionDetected: 'Определение выполнено, размерность: {value}',
      dimensionFailed: 'Не удалось определить, введите размерность вручную',
      remoteDimensionDetected: 'Обнаружена размерность: {value}',
      dimensionHint: 'Модель выбрана. Нажмите «Определить размерность», чтобы автоматически получить значение.',
      loadModelListFailed: 'Не удалось загрузить список моделей',
      listRefreshed: 'Список обновлён',
      fillModelAndUrl: 'Сначала заполните идентификатор модели и Base URL',
      remoteBaseUrlRequired: 'Для Remote API необходимо указать Base URL',
      unsupportedModelType: 'Неподдерживаемый тип модели',
      connectionSuccess: 'Соединение установлено',
      connectionFailed: 'Соединение не установлено',
      connectionConfigError: 'Соединение не установлено, проверьте конфигурацию',
      downloadStarted: 'Начата загрузка {name}',
      downloadCompleted: '{name} успешно загружена',
      downloadFailed: 'Не удалось загрузить {name}',
      downloadStartFailed: 'Не удалось запустить загрузку',
      ollamaUnavailable: 'Сервис Ollama недоступен, локальные модели недоступны для выбора',
      goToOllamaSettings: 'Открыть настройки',
      validation: {
        modelNameRequired: 'Введите название модели',
        modelNameEmpty: 'Название модели не может быть пустым',
        modelNameMax: 'Название модели не может превышать 100 символов',
        baseUrlRequired: 'Введите Base URL',
        baseUrlEmpty: 'Base URL не может быть пустым',
        baseUrlInvalid: 'Недопустимый Base URL, введите корректный адрес'
      }
    }
  },
  createChat: {
    title: 'Вопросы и ответы на основе базы знаний — AI помощник',
    newSessionTitle: 'Новая сессия',
    messages: {
      selectKnowledgeBase: 'Сначала выберите базу знаний',
      createFailed: 'Не удалось создать сессию',
      createError: 'Не удалось создать сессию, попробуйте позже'
    }
  },
  knowledgeList: {
    create: 'Создать базу знаний',
    createFAQ: 'Создать FAQ-базу',
    subtitle: 'Управляйте и организуйте свои базы знаний, поддерживаются документные и FAQ-базы знаний',
    uninitializedBanner: 'Некоторые базы знаний не инициализированы. Сначала настройте модели в разделе настроек, чтобы добавлять документы.',
    empty: {
      title: 'Базы знаний отсутствуют',
      description: 'Нажмите «Создать базу знаний» в левом быстром действии, чтобы добавить первую базу.'
    },
    delete: {
      confirmTitle: 'Подтверждение удаления',
      confirmMessage: 'Удалить базу знаний «{name}»? Отменить действие будет невозможно.',
      confirmButton: 'Удалить'
    },
    messages: {
      deleted: 'База знаний удалена',
      deleteFailed: 'Не удалось удалить базу знаний'
    },
    features: {
      knowledgeGraph: 'Граф знаний включен',
      multimodal: 'Мультимодальность включена',
      questionGeneration: 'Генерация вопросов включена'
    },
    processing: 'Обработка задачи импорта',
    processingDocuments: 'Обработка {count} документов',
    stats: {
      documents: 'Количество документов',
      faqEntries: 'FAQ записи',
      chunks: 'Количество фрагментов'
    },
    uploadProgress: {
      uploadingTitle: 'Загрузка документов папки в «{name}»',
      detail: 'Готово {completed} из {total} файлов',
      keepPageOpen: 'Пожалуйста, не закрывайте страницу, пока идет загрузка.',
      completedTitle: 'Загрузка для «{name}» завершена',
      completedDetail: 'Загружено {total} файлов. Обновляем список, чтобы показать статус разбора...',
      refreshing: 'Обновляем список и статусы разбора...',
      errorTip: 'Часть файлов загрузить не удалось. Проверьте уведомления.',
      unknownKb: 'База знаний {id}'
    }
  },
  knowledgeEditor: {
    titleCreate: 'Создать базу знаний',
    titleEdit: 'Настройки базы знаний',
    sidebar: {
      basic: 'Основная информация',
      models: 'Конфигурация моделей',
      chunking: 'Настройки разбиения',
      advanced: 'Дополнительные настройки',
      faq: 'FAQ настройки',
      graph: 'Граф знаний'
    },
    basic: {
      title: 'Основная информация',
      description: 'Укажите название и описание базы знаний',
      typeLabel: 'Тип базы знаний',
      typeDocument: 'Документальная',
      typeFAQ: 'FAQ (вопрос-ответ)',
      typeDescription: 'FAQ подходит для структурированных Q&A; документальный тип поддерживает загрузку файлов и разбиение.',
      nameLabel: 'Название базы знаний',
      namePlaceholder: 'Введите название базы знаний',
      descriptionLabel: 'Описание базы знаний',
      descriptionPlaceholder: 'Введите описание базы знаний (необязательно)'
    },
    buttons: {
      create: 'Создать базу знаний',
      save: 'Сохранить настройки'
    },
    messages: {
      loadModelsFailed: 'Не удалось загрузить список моделей',
      loadDataFailed: 'Не удалось загрузить данные базы знаний',
      notFound: 'База знаний не найдена',
      nameRequired: 'Пожалуйста, введите название базы знаний',
      embeddingRequired: 'Пожалуйста, выберите модель встраивания',
      summaryRequired: 'Пожалуйста, выберите модель суммаризации',
      multimodalInvalid: 'Проверка мультимодальной конфигурации не удалась',
      createSuccess: 'База знаний успешно создана',
      createFailed: 'Не удалось создать базу знаний',
      missingId: 'Отсутствует ID базы знаний',
      buildDataFailed: 'Не удалось сформировать данные для отправки',
      updateSuccess: 'Настройки сохранены',
      indexModeRequired: 'Выберите режим индексации для FAQ базы знаний'
    },
    document: {
      title: 'Управление документами',
      subtitle: 'Загружайте файлы кликом или перетаскиванием — поддерживается автоматический разбор разных форматов и умное разбиение на фрагменты для быстрого поиска',
    },
    faq: {
      title: 'Настройки FAQ',
      subtitle: 'Управление записями FAQ с пакетным импортом, редактированием и тестированием поиска',
      description: 'Определите стратегию индексации и общие правила для FAQ-базы знаний',
      indexModeLabel: 'Режим индексации',
      indexModeDescription: 'Только вопросы дают более высокую точность, вопросы+ответы повышают полноту выдачи.',
      questionIndexModeLabel: 'Режим индексации вопросов',
      questionIndexModeDescription: 'Объединенная: стандартные и похожие вопросы индексируются вместе. Раздельная: каждый вопрос индексируется независимо для более точного поиска, но требует больше места.',
      entryGuide: 'Каждый FAQ включает основной вопрос, похожие вопросы, негативные примеры и несколько ответов. Управляйте ими в деталях FAQ-базы.',
      tagDesc: 'Выберите категорию для записей FAQ',
      modes: {
        questionOnly: 'Только вопросы',
        questionAnswer: 'Вопрос + ответ',
        combined: 'Объединенная',
        separate: 'Раздельная'
      },
      standardQuestion: 'Основной вопрос',
      answers: 'Ответы',
      similarQuestions: 'Похожие вопросы',
      negativeQuestions: 'Негативные примеры',
      categoryLabel: 'Категория FAQ',
      categoryButton: 'Сменить категорию',
      editorCreate: 'Создать FAQ запись',
      editorEdit: 'Редактировать FAQ запись',
      addAnswer: 'Добавить ответ',
      answerPlaceholder: 'Введите содержимое ответа, поддерживается многострочный текст, нажмите Ctrl+Enter или нажмите кнопку для добавления',
      similarPlaceholder: 'Введите похожий вопрос и нажмите значок плюса для добавления',
      negativePlaceholder: 'Введите негативный пример и нажмите значок плюса для добавления',
      answerRequired: 'Добавьте хотя бы один ответ',
      noAnswer: 'Ответы отсутствуют',
      noSimilar: 'Похожие вопросы отсутствуют',
      noNegative: 'Нет негативных примеров',
      emptyTitle: 'Нет записей FAQ',
      emptyDesc: 'Нажмите "Создать FAQ запись" выше, чтобы начать',
      searchPlaceholder: 'Поиск стандартных вопросов...',
      searchTest: 'Тест поиска',
      searchTestTitle: 'Тест поиска FAQ',
      queryLabel: 'Запрос',
      queryPlaceholder: 'Введите вопрос для поиска',
      vectorThresholdLabel: 'Порог векторного сходства',
      vectorThresholdDesc: 'Диапазон 0-1, по умолчанию 0.7',
      keywordThresholdLabel: 'Порог совпадения ключевых слов',
      keywordThresholdDesc: 'Диапазон 0-1, по умолчанию 0.5',
      matchCountLabel: 'Количество результатов',
      matchCountDesc: 'Диапазон 1-50, по умолчанию 10',
      searchButton: 'Начать поиск',
      searching: 'Поиск...',
      searchResults: 'Результаты поиска',
      noResults: 'Совпадающих записей FAQ не найдено',
      score: 'Сходство',
      matchType: 'Тип совпадения',
      matchTypeEmbedding: 'Векторное совпадение',
      matchTypeKeywords: 'Совпадение ключевых слов',
      similarityThresholdLabel: 'Порог сходства',
      statusEnabled: 'Включено',
      statusDisabled: 'Выключено',
      statusEnableSuccess: 'Запись FAQ включена',
      statusDisableSuccess: 'Запись FAQ отключена',
      statusUpdateFailed: 'Не удалось обновить статус',
      batchOperations: 'Пакетные операции',
      batchUpdateTag: 'Пакетное обновление категории',
      batchUpdateTagTip: 'Установить категорию для {count} выбранных записей',
      batchEnable: 'Пакетное включение',
      batchDisable: 'Пакетное отключение',
    },
    faqImport: {
      title: 'Пакетный импорт FAQ',
      modeLabel: 'Режим импорта',
      appendMode: 'Добавить',
      replaceMode: 'Заменить существующие записи',
      fileLabel: 'Выберите файл',
      fileTip: 'Поддерживаются JSON / CSV / Excel. Заголовки CSV/Excel: 分类(必填), 问题(必填), 相似问题(选填-多个用##分隔), 反例问题(选填-多个用##分隔), 机器人回答(必填-多个用##分隔), 是否全部回复(选填-默认FALSE), 是否停用(选填-默认FALSE), 是否禁止被推荐(选填-默认False 可被推荐). Также поддерживается старый формат: standard_question, answers, similar_questions, negative_questions',
      clickToUpload: 'Нажмите для загрузки файла',
      dragDropTip: 'или перетащите файл сюда',
      importButton: 'Импортировать FAQ',
      deleteSelected: 'Удалить выбранные',
      deleteSuccess: 'Выбранные записи удалены',
      previewCount: 'Разобрано записей: {count}',
      previewMore: 'Ещё {count} записей не показано',
      importSuccess: 'Импорт завершён',
      parseFailed: 'Не удалось разобрать файл',
      invalidJSON: 'Неверный формат JSON',
      unsupportedFormat: 'Формат файла не поддерживается',
      selectFile: 'Сначала выберите файл для импорта',
      downloadExample: 'Скачать пример',
      downloadExampleJSON: 'Скачать пример JSON',
      downloadExampleCSV: 'Скачать пример CSV',
      downloadExampleExcel: 'Скачать пример Excel',
    },
    models: {
      title: 'Конфигурация моделей',
      description: 'Выберите подходящие AI-модели для базы знаний',
      llmLabel: 'LLM модель',
      llmDesc: 'Большая языковая модель для диалогов и вопросов-ответов',
      llmPlaceholder: 'Выберите LLM модель',
      embeddingLabel: 'Модель встраивания',
      embeddingDesc: 'Модель встраивания для векторизации текста',
      embeddingPlaceholder: 'Выберите модель встраивания',
      embeddingLocked: 'В базе знаний уже есть файлы. Модель встраивания нельзя изменить',
      rerankLabel: 'Модель ReRank',
      rerankDesc: 'Модель для переранжирования результатов поиска (необязательно)',
      rerankPlaceholder: 'Выберите модель ReRank (необязательно)'
    },
    chunking: {
      title: 'Настройки разбиения',
      description: 'Настройте параметры разбиения документов для улучшения качества поиска',
      sizeLabel: 'Размер блока',
      sizeDescription: 'Определяет количество символов в каждом блоке (100-4000)',
      characters: 'символов',
      overlapLabel: 'Перекрытие блоков',
      overlapDescription: 'Количество перекрывающихся символов между соседними блоками (0-500)',
      separatorsLabel: 'Разделители',
      separatorsDescription: 'Разделители, используемые при разбиении документов',
      separatorsPlaceholder: 'Выберите разделители',
      separators: {
        doubleNewline: 'Двойной перевод строки (\\n\\n)',
        singleNewline: 'Одинарный перевод строки (\\n)',
        periodCn: 'Китайская точка (。)',
        exclamationCn: 'Восклицательный знак (！)',
        questionCn: 'Вопросительный знак (？)',
        semicolonCn: 'Китайская точка с запятой (；)',
        semicolonEn: 'Точка с запятой (;)',
        space: 'Пробел ( )'
      }
    },
    advanced: {
      title: 'Расширенные настройки',
      description: 'Настройте генерацию вопросов и мультимодальные возможности',
      questionGeneration: {
        label: 'AI генерация вопросов',
        description: 'Генерация связанных вопросов для каждого фрагмента с помощью LLM при парсинге документа для улучшения полноты поиска. Включение увеличит время парсинга документа.',
        countLabel: 'Количество вопросов',
        countDescription: 'Количество вопросов для генерации на фрагмент документа (1-10)',
      },
      multimodal: {
        label: 'Мультимодальная функция',
        description: 'Включите понимание мультимедийного контента, такого как изображения и видео',
        vllmLabel: 'VLLM модель для зрения',
        vllmDescription: 'Визуально-языковая модель, необходимая для мультимодального понимания',
        vllmPlaceholder: 'Выберите VLLM модель (обязательно)',
        storageTitle: 'Конфигурация хранилища',
        storageTypeLabel: 'Тип хранилища',
        storageTypeDescription: 'Выберите способ хранения мультимодальных файлов (MinIO или Tencent Cloud COS)',
        storageTypeOptions: {
          minio: 'MinIO',
          cos: 'Tencent Cloud COS'
        },
        minioDisabledWarning: 'MinIO не включен. Автоматически переключено на Tencent Cloud COS. Чтобы использовать MinIO, сначала включите его в конфигурации системы.',
        minio: {
          bucketLabel: 'Имя Bucket',
          bucketDescription: 'Название бакета MinIO (обязательно)',
          bucketPlaceholder: 'Введите имя Bucket (обязательно)',
          useSslLabel: 'Использовать SSL',
          useSslDescription: 'Определяет, использовать ли SSL-соединение',
          pathPrefixLabel: 'Префикс пути',
          pathPrefixDescription: 'Необязательный префикс для путей хранения файлов',
          pathPrefixPlaceholder: 'Введите префикс пути'
        },
        cos: {
          secretIdLabel: 'SecretId',
          secretIdDescription: 'ID секретного ключа Tencent Cloud API (обязательно)',
          secretIdPlaceholder: 'Введите SecretId (обязательно)',
          secretKeyLabel: 'SecretKey',
          secretKeyDescription: 'Секретный ключ Tencent Cloud API (обязательно)',
          secretKeyPlaceholder: 'Введите SecretKey (обязательно)',
          regionLabel: 'Регион',
          regionDescription: 'Регион, в котором находится бакет COS (обязательно)',
          regionPlaceholder: 'Например: ap-guangzhou (обязательно)',
          bucketLabel: 'Имя Bucket',
          bucketDescription: 'Название бакета COS (обязательно)',
          bucketPlaceholder: 'Введите имя Bucket (обязательно)',
          appIdLabel: 'AppId',
          appIdDescription: 'ID приложения Tencent Cloud (обязательно)',
          appIdPlaceholder: 'Введите AppId (обязательно)',
          pathPrefixLabel: 'Префикс пути',
          pathPrefixDescription: 'Необязательный префикс для путей хранения файлов',
          pathPrefixPlaceholder: 'Введите префикс пути'
        }
      }
    }
  },
  chat: {
    title: 'Диалог',
    newChat: 'Новый чат',
    inputPlaceholder: 'Введите ваше сообщение...',
    send: 'Отправить',
    thinking: 'Думаю...',
    regenerate: 'Сгенерировать заново',
    copy: 'Копировать',
    delete: 'Удалить',
    reference: 'Ссылка',
    noMessages: 'Нет сообщений',
    // Дополнительные переводы для компонентов чата
    waitingForAnswer: 'Ожидание ответа...',
    cannotAnswer: 'Извините, я не могу ответить на этот вопрос.',
    summarizingAnswer: 'Подведение итогов ответа...',
    loading: 'Загрузка...',
    enterDescription: 'Введите описание',
    referencedContent: 'Использовано {count} связанных материалов',
    deepThinking: 'Глубокое мышление завершено',
    knowledgeBaseQandA: 'Вопросы и ответы на основе базы знаний',
    askKnowledgeBase: 'Задайте вопрос базе знаний',
    sourcesCount: '{count} источников',
    pleaseEnterContent: 'Пожалуйста, введите содержимое!',
    pleaseUploadKnowledgeBase: 'Пожалуйста, сначала загрузите базу знаний!',
    replyingPleaseWait: 'Идёт ответ, пожалуйста, попробуйте позже!',
    createSessionFailed: 'Не удалось создать сеанс',
    createSessionError: 'Ошибка создания сеанса',
    unableToGetKnowledgeBaseId: 'Невозможно получить ID базы знаний',
    summaryInProgress: 'Идёт подготовка ответа…',
    referencesTitle: 'Использовано {count} связанного материала',
    referenceIconAlt: 'Иконка ссылок на материалы',
    chunkIdLabel: 'ID фрагмента:',
    documentIdLabel: 'ID документа:',
    noPlanSteps: 'Подробные шаги не предоставлены',
    chunkIndexLabel: 'Фрагмент №{index}',
    chunkPositionLabel: '(позиция: {position})',
    noRelatedChunks: 'Связанные фрагменты не найдены',
    noSearchResults: 'Результаты поиска не найдены',
    relevanceHigh: 'Высокая релевантность',
    relevanceMedium: 'Средняя релевантность',
    relevanceLow: 'Низкая релевантность',
    relevanceWeak: 'Слабая релевантность',
    webSearchNoResults: 'Результаты веб-поиска не найдены',
    otherSource: 'Другие источники',
    webGroupIntro: 'Следующие {count} записей получены из',
    graphConfigTitle: 'Настройки графа',
    entityTypesLabel: 'Типы сущностей:',
    relationTypesLabel: 'Типы связей:',
    graphResultsHeader: 'Найдено {count} связанных результатов',
    graphNoResults: 'Данные графа не найдены',
    unknownLink: 'Неизвестная ссылка',
    contentLengthLabel: 'Длина {value}',
    notProvided: 'Не указано',
    promptLabel: 'Промпт',
    errorMessageLabel: 'Сообщение об ошибке',
    summaryLabel: 'Сводка',
    rawTextLabel: 'Исходный текст',
    collapseRaw: 'Свернуть оригинал',
    expandRaw: 'Развернуть оригинал',
    noWebContent: 'Содержимое страницы не получено',
    lengthChars: '{value} символов',
    lengthThousands: '{value} тыс. символов',
    lengthTenThousands: '{value} ×10⁴ символов',
    sqlQueryExecuted: 'Выполненный SQL-запрос:',
    sqlResultsLabel: 'Результаты:',
    rowsLabel: 'строк',
    columnsLabel: 'столбцов',
    noDatabaseRecords: 'Совпадающих записей не найдено',
    nullValuePlaceholder: '<NULL>',
    documentTitleLabel: 'Название документа:',
    chunkCountLabel: 'Количество фрагментов:',
    chunkCountValue: '{count} фрагментов',
    documentDescriptionLabel: 'Описание:',
    documentStatusLabel: 'Статус:',
    documentSourceLabel: 'Источник:',
    documentFileLabel: 'Файл:',
    documentMetadataLabel: 'Метаданные',
    documentInfoSummaryLabel: 'Информация о документах',
    documentInfoCount: '{count} из {requested} документов получено',
    documentInfoErrors: 'Ошибки',
    documentInfoEmpty: 'Нет данных о документах',
    statusDescription: 'Информация о статусе',
    statusIndexed: 'Документ проиндексирован и доступен для поиска',
    statusSearchable: 'Можно искать содержимое документа с помощью инструментов',
    statusChunkDetailAvailable: 'Используйте get_chunk_detail для просмотра фрагментов',
    positionLabel: 'Позиция:',
    chunkPositionValue: 'Фрагмент №{index}',
    contentLengthLabelSimple: 'Длина содержимого:',
    fullContentLabel: 'Полный текст',
    copyContent: 'Скопировать содержимое',
    knowledgeBaseCount: '{count} баз знаний',
    noKnowledgeBases: 'Нет доступных баз знаний',
    rawOutputLabel: 'Исходный вывод',
    selectKnowledgeBaseWarning: 'Пожалуйста, выберите хотя бы одну базу знаний',
    processError: 'Ошибка обработки'
  },
  language: {
    zhCN: '简体中文',
    enUS: 'English',
    ruRU: 'Русский',
    selectLanguage: 'Выбрать язык',
    language: 'Язык',
    languageDescription: 'Выберите язык отображения интерфейса',
    languageSaved: 'Настройки языка сохранены'
  },
  general: {
    title: 'Общие настройки',
    allSettings: 'Все настройки',
    description: 'Настройка языка, внешнего вида и других базовых параметров',
    settings: 'Настройки',
    close: 'Закрыть настройки'
  },
  platform: {
    subtitle: 'Корпоративная платформа интеллектуального поиска документов',
    description: 'Упрощение понимания сложных документов и точного поиска',
    rag: 'RAG расширенная генерация',
    hybridSearch: 'Гибридный поиск',
    localDeploy: 'Локальное развертывание',
    multimodalParsing: 'Мультимодальный анализ документов',
    hybridSearchEngine: 'Гибридная поисковая система',
    ragQandA: 'RAG интеллектуальный вопрос-ответ',
    independentTenant: 'Независимое пространство арендатора',
    fullApiAccess: 'Полный доступ к API',
    knowledgeBaseManagement: 'Управление базой знаний',
    carousel: {
      agenticRagTitle: 'Agentic RAG',
      agenticRagDesc: 'Переформулировка запроса + умный отбор + повторная ранжировка',
      hybridSearchTitle: 'Гибридная стратегия поиска',
      hybridSearchDesc: 'BM25 + Вектор + Граф знаний',
      smartDocRetrievalTitle: 'Интеллектуальный поиск документов',
      smartDocRetrievalDesc: 'Многоформатный разбор PDF/Word/изображений'
    }
  },
  time: {
    today: 'Сегодня',
    yesterday: 'Вчера',
    last7Days: 'Последние 7 дней',
    last30Days: 'Последние 30 дней',
    lastYear: 'Последний год',
    earlier: 'Ранее'
  },
  upload: {
    uploadDocument: 'Загрузить документ',
    uploadFolder: 'Загрузить папку',
    onlineEdit: 'Онлайн редактирование',
    deleteRecord: 'Удалить запись'
  },
  // Новые разделы
  agentSettings: {
    title: 'Настройки Agent',
    description: 'Настройте поведение и параметры AI Agent. Эти параметры применяются ко всем чатам с включённым режимом Agent.',
    status: {
      label: 'Статус Agent',
      ready: 'Готов',
      notReady: 'Не готов',
      hint: 'После завершения конфигурации статус автоматически изменится на «Готов». Затем можно включить режим Agent в диалоге.',
      missingThinkingModel: 'модель мышления',
      missingRerankModel: 'модель ранжирования',
      missingAllowedTools: 'разрешённые инструменты',
      pleaseConfigure: 'Пожалуйста, настройте: {items}',
      goConfigureModels: 'Перейти к настройке моделей →'
    },
    maxIterations: {
      label: 'Макс. число итераций',
      desc: 'Максимальное число шагов рассуждений при выполнении задач'
    },
    thinkingModel: {
      label: 'Модель мышления',
      desc: 'LLM для рассуждений и планирования',
      hint: 'Требуется модель с поддержкой function call'
    },
    rerankModel: {
      label: 'Модель Rerank',
      desc: 'Повторная ранжировка результатов поиска и нормализация релевантности'
    },
    model: {
      placeholder: 'Поиск моделей...',
      addChat: 'Добавить новую модель диалога',
      addRerank: 'Добавить новую модель Rerank'
    },
    temperature: {
      label: 'Температура',
      desc: 'Контролирует случайность ответа. 0 — детерминированно, 1 — максимально случайно'
    },
    allowedTools: {
      label: 'Разрешённые инструменты',
      desc: 'Список инструментов, доступных Agent',
      placeholder: 'Выберите инструменты...',
      empty: 'Инструменты не настроены'
    },
    systemPrompt: {
      label: 'Системный промпт',
      desc: 'Настройте системный промпт Agent. Подстановки будут заменены во время выполнения.',
      availablePlaceholders: 'Доступные подстановки:',
      hintPrefix: 'Подсказка: при вводе',
      hintSuffix: 'откроется список доступных подстановок',
      custom: 'Пользовательский промпт',
      disabledHint: 'Сейчас используется промпт по умолчанию. Включите пользовательский, чтобы применить содержимое ниже.',
      placeholder: 'Введите системный промпт или оставьте пустым для значения по умолчанию...',
      tabHint: 'Настройте разные промпты для режимов с включённым и отключённым веб-поиском.',
      tabWebOn: 'Веб-поиск включён',
      tabWebOff: 'Веб-поиск отключён'
    },
    reset: {
      header: 'Сбросить к промпту по умолчанию',
      body: 'Сбросить к значению по умолчанию? Текущий пользовательский промпт будет перезаписан.'
    },
    errors: {
      selectThinkingModel: 'Выберите модель мышления перед включением режима Agent',
      selectAtLeastOneTool: 'Выберите хотя бы один инструмент',
      iterationsRange: 'Макс. число итераций должно быть от 1 до 20',
      temperatureRange: 'Температура должна быть от 0 до 2',
      validationFailed: 'Ошибка проверки конфигурации'
    },
    toasts: {
      iterationsSaved: 'Макс. число итераций сохранено',
      thinkingModelSaved: 'Модель мышления сохранена',
      rerankModelSaved: 'Модель Rerank сохранена',
      temperatureSaved: 'Температура сохранена',
      toolsUpdated: 'Инструменты обновлены',
      customPromptEnabled: 'Пользовательский промпт включён',
      defaultPromptEnabled: 'Включён промпт по умолчанию',
      resetToDefault: 'Восстановлено значение по умолчанию',
      systemPromptSaved: 'Системный промпт сохранён',
      autoDisabled: 'Конфигурация Agent неполная. Режим Agent автоматически выключен'
    }
  },
  conversationSettings: {
    enableQueryExpansion: {
      label: 'Включить расширение запросов',
      desc: 'При низкой выдаче обращаться к LLM для генерации дополнительных запросов (дороже и медленнее)'
    },
    toasts: {
      enableQueryExpansionSaved: 'Настройка расширения запросов сохранена'
    }
  },
  mcpSettings: {
    title: 'Сервисы MCP',
    description: 'Управление внешними сервисами MCP (Model Context Protocol) для использования инструментов и ресурсов в режиме Agent',
    configuredServices: 'Настроенные сервисы',
    manageAndTest: 'Управляйте и тестируйте подключения MCP',
    addService: 'Добавить сервис',
    empty: 'Сервисы MCP отсутствуют',
    addFirst: 'Добавить первый сервис MCP',
    actions: {
      test: 'Тест соединения'
    },
    toasts: {
      loadFailed: 'Не удалось загрузить список MCP сервисов',
      enabled: 'Сервис MCP включён',
      disabled: 'Сервис MCP выключен',
      updateStateFailed: 'Не удалось обновить статус сервиса MCP',
      testing: 'Тестируем {name}...',
      noResponse: 'Тест не удался: нет ответа от сервера',
      testFailed: 'Не удалось протестировать сервис MCP',
      deleted: 'Сервис MCP удалён',
      deleteFailed: 'Не удалось удалить сервис MCP'
    },
    deleteConfirmBody: 'Удалить сервис MCP «{name}»? Действие необратимо.',
    unnamed: 'Без названия'
  },
  modelSettings: {
    title: 'Настройки моделей',
    description: 'Управление типами AI‑моделей: локальные (Ollama) и удалённые API',
    actions: {
      addModel: 'Добавить модель',
      setDefault: 'Сделать по умолчанию'
    },
    chat: {
      title: 'Модели диалога',
      desc: 'Модели для диалога',
      empty: 'Нет моделей диалога'
    },
    source: {
      remote: 'Удалённая',
      openaiCompatible: 'Совместимо с OpenAI'
    },
    embedding: {
      title: 'Модели встраивания',
      desc: 'Модели для векторизации текста',
      empty: 'Нет моделей встраивания'
    },
    rerank: {
      title: 'Модели ReRank',
      desc: 'Модели для повторной ранжировки результатов',
      empty: 'Нет моделей ReRank'
    },
    vllm: {
      title: 'VLLM модели зрения',
      desc: 'Визуально-языковые модели для мультимодального понимания',
      empty: 'Нет VLLM моделей'
    },
    toasts: {
      nameRequired: 'Название модели не может быть пустым',
      nameTooLong: 'Название модели не может превышать 100 символов',
      baseUrlRequired: 'Для удалённых API требуется Base URL',
      baseUrlInvalid: 'Некорректный Base URL, укажите правильный адрес',
      dimensionInvalid: 'Размерность встраивания должна быть 128–4096',
      updated: 'Модель обновлена',
      added: 'Модель добавлена',
      saveFailed: 'Не удалось сохранить модель',
      deleted: 'Модель удалена',
      deleteFailed: 'Не удалось удалить модель',
      setDefault: 'Установлено по умолчанию',
      setDefaultFailed: 'Не удалось установить по умолчанию'
    },
    confirmDelete: 'Удалить эту модель?'
  },
  ollamaSettings: {
    title: 'Настройки Ollama',
    description: 'Управление локальным сервисом Ollama и моделями',
    status: {
      label: 'Статус Ollama',
      desc: 'Автоматическая проверка доступности локального сервиса Ollama. При ошибке адреса или остановке сервиса статус будет «Недоступно».',
      testing: 'Проверка',
      available: 'Доступно',
      unavailable: 'Недоступно',
      untested: 'Не проверено',
      retest: 'Проверить снова'
    },
    address: {
      label: 'Адрес сервиса',
      desc: 'API‑адрес локального сервиса Ollama, определяется автоматически. Чтобы изменить, задайте значение в .env',
      placeholder: 'http://localhost:11434',
      failed: 'Ошибка подключения. Проверьте, запущен ли Ollama и корректен ли адрес'
    },
    download: {
      title: 'Загрузка моделей',
      descPrefix: 'Введите имя модели для загрузки,',
      browse: 'Открыть каталог моделей Ollama',
      placeholder: 'например: qwen2.5:0.5b',
      download: 'Скачать',
      downloading: 'Загрузка: {name}'
    },
    installed: {
      title: 'Установленные модели',
      desc: 'Список моделей, установленных в Ollama',
      empty: 'Установленные модели отсутствуют'
    },
    toasts: {
      connected: 'Соединение установлено',
      connectFailed: 'Не удалось подключиться. Проверьте, запущен ли Ollama',
      listFailed: 'Не удалось получить список моделей',
      downloadFailed: 'Не удалось загрузить. Попробуйте позже',
      downloadStarted: 'Начата загрузка модели {name}',
      downloadCompleted: 'Модель {name} загружена',
      progressFailed: 'Не удалось получить прогресс загрузки'
    }
  },
  mcpServiceDialog: {
    addTitle: 'Добавить сервис MCP',
    editTitle: 'Редактировать сервис MCP',
    name: 'Название сервиса',
    namePlaceholder: 'Введите название сервиса',
    description: 'Описание',
    descriptionPlaceholder: 'Введите описание сервиса',
    transportType: 'Тип транспорта',
    transport: {
      sse: 'SSE (Server-Sent Events)',
      httpStreamable: 'HTTP Streamable',
      stdio: 'Stdio'
    },
    serviceUrl: 'URL сервиса',
    serviceUrlPlaceholder: 'https://example.com/mcp',
    command: 'Команда',
    args: 'Аргументы',
    argPlaceholder: 'Аргумент {index}',
    addArg: 'Добавить аргумент',
    envVars: 'Переменные окружения',
    envKeyPlaceholder: 'Имя переменной',
    envValuePlaceholder: 'Значение',
    addEnvVar: 'Добавить переменную',
    enableService: 'Включить сервис',
    authConfig: 'Аутентификация',
    apiKey: 'API Key',
    bearerToken: 'Bearer Token',
    optional: 'Необязательно',
    advancedConfig: 'Дополнительно',
    timeoutSec: 'Таймаут (с)',
    retryCount: 'Число попыток',
    retryDelaySec: 'Задержка (с)',
    rules: {
      nameRequired: 'Введите название сервиса',
      transportRequired: 'Выберите тип транспорта',
      urlRequired: 'Введите URL сервиса',
      urlInvalid: 'Введите корректный URL',
      commandRequired: 'Выберите команду (uvx или npx)',
      argsRequired: 'Введите хотя бы один аргумент'
    },
    toasts: {
      created: 'Сервис MCP создан',
      updated: 'Сервис MCP обновлён',
      createFailed: 'Не удалось создать сервис MCP',
      updateFailed: 'Не удалось обновить сервис MCP'
    }
  },
  manualEditor: {
    placeholders: {
      heading: 'Заголовок {level}',
      listItem: 'Элемент списка',
      taskItem: 'Задача',
      quote: 'Текст цитаты',
      code: 'Содержимое кода',
      linkText: 'Текст ссылки',
      imageAlt: 'Описание',
      bold: 'Жирный текст',
      italic: 'Курсив',
      strike: 'Зачеркнутый текст',
      inlineCode: 'code'
    },
    table: {
      column1: 'Колонка 1',
      column2: 'Колонка 2',
      cell: 'Содержимое'
    },
    toolbar: {
      bold: 'Жирный',
      italic: 'Курсив',
      strike: 'Зачёркнутый',
      inlineCode: 'Встроенный код',
      heading1: 'Заголовок 1',
      heading2: 'Заголовок 2',
      heading3: 'Заголовок 3',
      bulletList: 'Маркированный список',
      orderedList: 'Нумерованный список',
      taskList: 'Список задач',
      blockquote: 'Цитата',
      codeBlock: 'Блок кода',
      link: 'Вставить ссылку',
      image: 'Вставить изображение',
      table: 'Вставить таблицу',
      horizontalRule: 'Горизонтальная линия'
    },
    view: {
      toggleToEdit: 'Переключить в режим редактирования',
      toggleToPreview: 'Переключить в режим предпросмотра',
      editLabel: 'Вернуться к редактированию',
      previewLabel: 'Предпросмотр'
    },
    preview: {
      empty: 'Пока нет содержимого'
    },
    title: {
      edit: 'Редактировать Markdown-знание',
      create: 'Создать Markdown-знание'
    },
    labels: {
      currentKnowledgeBase: 'Текущая база знаний'
    },
    defaultTitlePrefix: 'Новый документ',
    error: {
      fetchDetailFailed: 'Не удалось получить сведения о знании',
      saveFailed: 'Не удалось сохранить, попробуйте позже'
    },
    warning: {
      selectKnowledgeBase: 'Пожалуйста, выберите целевую базу знаний',
      enterTitle: 'Введите заголовок знания',
      enterContent: 'Введите содержимое знания',
      contentTooShort: 'Контент слишком короткий. Добавьте больше информации перед публикацией'
    },
    success: {
      draftSaved: 'Черновик сохранён',
      published: 'Знание опубликовано и начата индексация'
    },
    form: {
      knowledgeBaseLabel: 'Целевая база знаний',
      knowledgeBasePlaceholder: 'Выберите базу знаний',
      titleLabel: 'Заголовок знания',
      titlePlaceholder: 'Введите заголовок',
      contentPlaceholder: 'Поддерживается Markdown. Используйте # заголовки, списки, блоки кода и т.д.'
    },
    noDocumentKnowledgeBases: 'Нет доступных баз знаний типа "документ". Пожалуйста, создайте одну сначала',
    status: {
      draftTag: 'Статус: Черновик',
      publishedTag: 'Статус: Опубликовано',
      lastUpdated: 'Последнее обновление: {time}'
    },
    loading: {
      content: 'Загрузка содержимого...',
      preparing: 'Подготовка редактора...'
    },
    actions: {
      cancel: 'Отмена',
      saveDraft: 'Сохранить черновик',
      publish: 'Опубликовать'
    }
  },
  input: {
    addModel: 'Добавить модель',
    placeholder: 'Задайте вопрос на основе базы знаний',
    agentMode: 'Agent режим',
    normalMode: 'Обычный режим',
    normalModeDesc: 'RAG-вопросы и ответы по базе знаний',
    agentModeDesc: 'Шаблон рассуждений ReAct, многошаговое мышление',
    agentNotReadyTooltip: 'Agent не готов. Пожалуйста, завершите настройку.',
    agentNotReadyDetail: 'Agent не готов. Пожалуйста, настройте следующее: {reasons}',
    agentMissingAllowedTools: 'Разрешённые инструменты',
    agentMissingSummaryModel: 'Модель беседы (Summary Model)',
    agentMissingRerankModel: 'Модель переранжирования (Rerank Model)',
    goToSettings: 'Перейти к настройкам →',
    webSearch: {
      toggleOn: 'Включить веб-поиск',
      toggleOff: 'Выключить веб-поиск',
      notConfigured: 'Веб-поиск не настроен'
    },
    knowledgeBase: 'База знаний',
    knowledgeBaseWithCount: 'База знаний ({count})',
    notConfigured: 'Не настроено',
    model: 'Модель',
    remote: 'Удалённая',
    noModel: 'Нет доступных моделей',
    stopGeneration: 'Остановить генерацию',
    send: 'Отправить',
    thinkingLabel: 'Thinking:',
    messages: {
      enterContent: 'Сначала введите содержимое!',
      selectKnowledge: 'Пожалуйста, выберите базу знаний!',
      replying: 'Ответ формируется, попробуйте позже!',
      agentSwitchedOn: 'Переключено в Agent режим',
      agentSwitchedOff: 'Переключено в обычный режим',
      agentEnabled: 'Agent режим включён',
      agentDisabled: 'Agent режим отключён',
      agentNotReadyDetail: 'Agent не готов. Пожалуйста, настройте следующее: {reasons}',
      agentMissingAllowedTools: 'Разрешённые инструменты',
      agentMissingSummaryModel: 'Модель беседы (Summary Model)',
      agentMissingRerankModel: 'Модель переранжирования (Rerank Model)',
      webSearchNotConfigured: 'Веб-поиск не настроен. Сначала выберите провайдера и настройте ключи в разделе настроек.',
      webSearchEnabled: 'Веб-поиск включён',
      webSearchDisabled: 'Веб-поиск выключен',
      sessionMissing: 'ID сессии не существует',
      messageMissing: 'Не удалось получить ID сообщения. Обновите страницу и попробуйте снова.',
      stopSuccess: 'Генерация остановлена',
      stopFailed: 'Не удалось остановить. Попробуйте ещё раз.'
    }
  }
}